package com.event.management.frontend.dto;

import lombok.Data;
import javax.validation.Valid;
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Past;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;

/**
 * 创建订单DTO
 */
@Data
public class OrderCreateDTO implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    /**
     * 活动ID
     */
    @NotNull(message = "活动ID不能为空")
    private Long eventId;
    
    /**
     * 联系人姓名
     */
    @NotBlank(message = "联系人姓名不能为空")
    private String contactName;
    
    /**
     * 联系人手机号
     */
    @NotBlank(message = "联系人手机号不能为空")
    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
    private String contactPhone;
    
    /**
     * 联系人邮箱
     */
    @Email(message = "邮箱格式不正确")
    private String contactEmail;
    
    /**
     * 收货详细地址
     */
    @NotBlank(message = "收货详细地址不能为空")
    private String address;
    
    /**
     * 邮政编码
     */
    @Pattern(regexp = "^\\d{6}$", message = "邮政编码格式不正确")
    private String zipCode;
    
    /**
     * 出生日期
     */
    @NotNull(message = "出生日期不能为空")
    @Past(message = "出生日期必须是过去的日期")
    private LocalDate birthDate;
    
    /**
     * 国家
     */
    @NotBlank(message = "国家不能为空")
    private String country;
    
    /**
     * 支付方式
     */
    @NotBlank(message = "支付方式不能为空")
    private String paymentMethod;
    
    /**
     * 支付详情，当支付方式为creditcard时必填
     */
    private PaymentDetails paymentDetails;
    
    /**
     * 票种信息列表
     */
    @NotEmpty(message = "票种信息不能为空")
    @Valid
    private List<TicketItem> tickets;
    
    /**
     * 备注说明
     */
    private String note;
    
    /**
     * 票种选择项
     */
    @Data
    public static class TicketItem implements Serializable {
        
        private static final long serialVersionUID = 2L;
        
        /**
         * 票种ID
         */
        @NotNull(message = "票种ID不能为空")
        private Long ticketId;
        
        /**
         * 购买数量
         */
        @NotNull(message = "购买数量不能为空")
        @Min(value = 1, message = "购买数量必须大于0")
        private Integer quantity;
    }
    
    /**
     * 支付详情
     */
    @Data
    public static class PaymentDetails implements Serializable {
        
        private static final long serialVersionUID = 3L;
        
        /**
         * 银行卡号
         */
        private String cardNumber;
        
        /**
         * 持卡人姓名
         */
        private String cardHolder;
    }
} 